﻿#ifndef _APP_STRUCT_H_
#define _APP_STRUCT_H_

#include <stdint.h>
#include "vd_cfg.h"

#define LAST_CFG                (4000)
#define	NEW_PROGRAM_FLAG_ADDR   (1056)
#define NEW_PROGRAM_LEN_ADDR    (1060)

#pragma pack(push,1)
/*****************************************************************
        Flash分配
     _________________
    |                 |
    |  用户其它数据   |
    |_________________| _存储用户数据起始地址(FLASH_USERDATE_ADDR)
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    |                 |
    |  运行用户程序   |
    |                 |
    |                 |
    |_________________| _运行用户程序起始地址(FLASH_APP1_ADDR)
    |                 |
    |                 |
    |  运行BootLoader |
    |                 |
    |_________________| _Flash基地址(运行BootLoader)

*********************************************************************/

/** @addtogroup Peripheral_memory_map
  * @{
  */

#define FLASH_BASE                       ((uint32_t)0x08000000)
#define SPIM_FLASH_BASE                  ((uint32_t)0x08400000)
#define USD_BASE                         ((uint32_t)0x1FFFF800)
#define SRAM_BASE                        ((uint32_t)0x20000000)
#define PERIPH_BASE                      ((uint32_t)0x40000000)
#define XMC_REG_BASE                     ((uint32_t)0xA0000000)
#define DEBUG_BASE                       ((uint32_t)0xE0042000)

#define APB1PERIPH_BASE                  (PERIPH_BASE + 0x00000)
#define APB2PERIPH_BASE                  (PERIPH_BASE + 0x10000)
#define AHBPERIPH_BASE                   (PERIPH_BASE + 0x20000)

/*设置Flash*/
#define FLASH_MCU_BASE        FLASH_BASE                            //Flash基地址
#define FLASH_MCU_SIZE        (1024*1024)                           //所选MCU的FLASH容量大小(单位为KB)
#define FLASH_SECTOR_SIZE     (2048)                                //每页Flash大小(单位为B)

#define FLASH_BOOT_SIZE       (18*FLASH_SECTOR_SIZE)               //BootLoader所用FLASH大小(KB)

#define FLASH_IAP_SIZE        (1*FLASH_SECTOR_SIZE)                //存储升级数据所用FLASH大小(KB)

#define FLASH_NET_SIZE        (1*FLASH_SECTOR_SIZE)

//通道模块配置表
#define FLASH_CHANNEL_CONFIG_SIZE       (1*FLASH_SECTOR_SIZE)

//采集模型配置参数
#define FLASH_MODELS_LIST_CONFIG_SIZE   (1*FLASH_SECTOR_SIZE)

//遥测表 //遥信表 //遥脉表 //遥空表 //遥设表
#define FLASH_MODBUS_METER_SIZE         (10*FLASH_SECTOR_SIZE)


 /******所有的  存储用户数据所用FLASH大小(KB) *****/
#define FLASH_USERDATA_SIZE     (   FLASH_IAP_SIZE +\
                                    FLASH_NET_SIZE +\
                                    FLASH_CHANNEL_CONFIG_SIZE +\
                                    FLASH_MODBUS_METER_SIZE+\
                                    FLASH_MODELS_LIST_CONFIG_SIZE )

//用户程序运行地址
#define FLASH_APP1_ADDR      (FLASH_MCU_BASE + FLASH_BOOT_SIZE)                     //在BootLoader程序上面
//运行用户程序Flash大小(字节)
#define FLASH_APP1_SIZE      (FLASH_MCU_SIZE - FLASH_BOOT_SIZE - FLASH_USERDATA_SIZE )



//存储用户数据的FLASH起始地址 (FLASH最后FLASH_USERDATA_SIZE(KB))
/*************************升级 配置参数*********************************************/
#define FLASH_IAP_ADDR              (FLASH_APP1_ADDR + FLASH_APP1_SIZE)

#define FLASH_IAP_PROG_ADDR         (FLASH_IAP_ADDR + FLASH_IAP_SIZE -4)
#define FLASH_IAP_DV_ADDR           (FLASH_IAP_ADDR + 4)

#define USERAPP_SP_ADDR             (FLASH_APP1_ADDR + 0)
#define USERAPP_VECTOR_ADDR         (FLASH_APP1_ADDR + 4)

/*************************用户配置参数*********************************************/
#define FLASH_USERDATE_ADDR                     ( FLASH_IAP_ADDR + FLASH_IAP_SIZE)

//系统基本配置参数+项目参数+串口通道
#define  FLASH_SYSTEM_BASE_ADDR                 FLASH_USERDATE_ADDR
//串口通道配置参数
#define FLASH_CHANNEL_CONFIG_ADDR               (FLASH_SYSTEM_BASE_ADDR+FLASH_NET_SIZE)
//采集模型配置参数 (分路模块采集数据大小)
#define FLASH_MODEL_LIST_CONFIG_ADDR            (FLASH_CHANNEL_CONFIG_ADDR+FLASH_CHANNEL_CONFIG_SIZE)
//采集寄存器数据参数（寄存器的各种属性配置）
#define FLASH_MODBUS_METER_ADDR                 (FLASH_MODEL_LIST_CONFIG_ADDR+FLASH_MODELS_LIST_CONFIG_SIZE)


typedef struct _Batch_No{
   uint16_t year;       /*!< specifies the years of calendar.   */
   uint8_t  month;      /*!< specifies the months of calendar.  */
   uint8_t  date;       /*!< specifies the date of calendar.    */
   uint8_t  hour;       /*!< specifies the hours of calendar.   */
   uint8_t  min;        /*!< specifies the minutes of calendar. */
   uint8_t  sec;        /*!< specifies the second of calendar.  */
   uint8_t  week;       /*!< specifies the weeks of calendar.   */
}Batch_No;

typedef struct _ip{

    uint8_t  ip[4];
    uint16_t port;
    uint16_t Reserved;
}ipv4_t;

typedef struct{                         //len

    uint8_t  net8021x_en;                //len=1           //802d1x 是否启用

    uint8_t  net8021x_name[16];          //认证用户名
    uint8_t  net8021x_password[16];      //认证密码

    uint8_t  admin_name[32];             //管理员用户名
    uint8_t  admin_password[32];         //管理员密码

    uint8_t  normal_name[32];            //普通用户名
    uint8_t  normal_password[32];        //普通员密码

}CONFIG_WEB_REG_t;

typedef struct{

  char GPSLON[16];                      // 定位坐标经度
  char GPSLAT[16];                      // 定位坐标纬度
  char location[200];                   //"安装位置"
  char company[200];                    //"维护公司"
  char project[100];                    //"项目编号"
  char poleCode[100];                    //杆件号

}CONFIG_PROJECT_REG_t;

typedef struct{                                 //len=67

    uint8_t  Factory[2];     //len=20          //恢复出厂设置标志
    uint8_t  mac[6];         //len=6           //MAC地址

    uint8_t  netmask[4];     //len=4           //子网掩码
    uint8_t  gateway[4];     //len=4           //网关

    uint8_t  hwver[4];       //len=4           //硬件版本号
    uint8_t  fwver[4];       //len=4           //软件版本号

    uint8_t  MODEL_NO[32];   //len=10          //产品型号
    uint8_t  Device_ID[32];  //len=20          //设备编号

    ipv4_t   host;            //len=8           //远端IP
    ipv4_t   local;           //len=8           //本地IP
    ipv4_t   mqtthost;        //len=8           //mqtt服务器 远端IP
    ipv4_t   confighost;      //len=8           //配置服务器 远端IP

    Batch_No sn;              //len=6           //生产批号

    uint16_t  addr485;        //len=1           //rs485地址

}CONFIG_NET_REG_t;

/******************串口通道配置参数********************************/
typedef union
{
    uint8_t u8data[2];
    uint16_t u16data;
    struct
    {
        uint8_t WordLength:4;    /******
                                //0-3 bit数据位：(缺省8位)
                                //0x0:8位
                                //0x1:9位
                                //0x2:7位 ******/
        uint8_t StopBits:4;       /******
                                    //4-7 bit停止位：(缺省1位)
                                    //0x0:1位
                                    //0x1:2位
                                    //0x2:1.5位  ******/
        uint8_t Parity:4;         /******
                                  //8-11 bit校验位：(缺省无校验)
                                  //Ox0:无校验
                                  //0x1:偶校验
                                  //0x2:奇校验******/
        uint8_t ulBaudRate:4;    /**** 12-15 bit波特率：(9600)
                                  //0x0:115200
                                  //0x1:57600
                                  //0x2:38400
                                  //0x3:19200
                                  //0x4:9600
                                  //0x5:4800
                                  //0x6:2400 ****/
    }Config;
}UART_UNION;

typedef struct   _UART_Channel_
{
    uint8_t ENABLE;               //是否启用
    uint8_t protocol;             //通讯协议 0:透传 1;纽脉自定协议 2；modbus_rtu
    uint16_t poll_out_time;       //轮询超时时间
    uint16_t interval_time;       //报文发布最小间隔
    UART_UNION uart_union;        //波特率配置

}UART_Channel_Typedef;

typedef struct{

    CONFIG_NET_REG_t Net;
    CONFIG_PROJECT_REG_t Project;
    CONFIG_WEB_REG_t Web;
    UART_Channel_Typedef uart_channel[8];  // 8个串口  通道     len = 8*10

}CONFIG_SYSTEM_BASE;             //第一页flash中数据



/**************** modbus 表 属性***********************/
typedef enum
{
    SURVERY_METER_T = 0x00,   //遥测表

    SIGNAL_METER_T,           //遥信表

    PULSE_METER_T,            //遥脉表

    CONTROL_METER_T,          //遥空表

    SET_METER_T,              //遥设表

    NM_METER_T,               //纽脉表
}Modbus_Type;

/**************** 字节类型 表 属性***********************/
typedef enum
{
    uint8_type = 0,             //单字节
    int16_type,                 //有符号短整型
    uint16_type,                //无符号短整型
    float_type,                 //浮点型
    x_int16_type,               //直译短整形（最高位为符号位）

}Modbus_Data_Type;
/**************** 字节顺序 表 属性***********************/
typedef enum
{
     Float_Big_endian = 0,              //Float Big-endian     字节顺序:A B C D
     Float_Little_endian,               //Float Little-endian   字节顺序:D C B A
     Float_Big_endian_swap,             //Float Big-endian byte swap      字节顺序:B A D C
     Float_Little_endian_swap,          //Float Little-endian byte swap    字节顺序:C D A B
}Modbus_Byte_Seq_Type;

typedef struct{

    uint8_t   Name[50];                   //名称 C
    uint8_t   key[10];                    //关键字
    uint16_t  CMD ;                       //功能码 J
    uint16_t  ModbusType;                 //modbus属性


    uint16_t  Reg_Address;               //寄存器地址 E
    uint16_t  Reg_Number;                //寄存器个数 F

    uint16_t  Data_Number;               //数据字节个数 G
    uint16_t  Data_Type;                 //数据类型 H

    uint16_t  byte_seq;                  //字节顺序 I  （0：高前低后  1：低后高前）

    uint16_t  Offset;                    //偏移值(基值) L

    uint16_t  Mask;                      //掩码(值解析)

    float  Factor;                       //系数 K

}CONFIG_MODBUS_SURVERY_METER;            //遥测表

typedef struct{

    uint8_t   Name[50];                  //名称 C
    uint8_t   key[10];                   //关键字
    uint16_t  CMD ;                      //功能码 J
    uint16_t  ModbusType;                //modbus属性


    uint16_t  Reg_Address;               //寄存器地址 E
    uint16_t  Bit_Number;                //位号
    uint16_t  Signal_Value;              //遥信值
    uint16_t  Signal_Type;               //遥信解析方式

    uint16_t  Mask;                      //掩码(值解析)
    uint16_t  byte_seq;                  //字节顺序
    uint16_t  soe;                       //是否自动生成SOE
    uint16_t  analysis;

}CONFIG_MODBUS_SIGNAL_METER;             //遥信表

typedef struct{

    uint8_t   Name[50];                   //名称 C
    uint8_t   key[10];                   //关键字
    uint16_t  CMD ;                      //功能码 J
    uint16_t  ModbusType;                //modbus属性


    uint16_t  Reg_Address;               //寄存器地址
    uint16_t  Reg_Number;                //寄存器个数
    uint16_t  Data_Number;               //数据字节个数
    uint16_t  Data_Type;                 //数据类型 H

    uint16_t  byte_seq;                  //字节顺序 I （0：高前低后  1：低后高前）

    uint16_t  Offset;                    //偏移值(基值) L

    float  Factor;                       //系数 K

}CONFIG_MODBUS_PULSE_METER;            //遥脉表

typedef struct{

    uint8_t   Name[50];                   //名称 C
    uint8_t   key[10];                   //关键字
    uint8_t   CMD ;                      //功能码 J
    uint8_t   remoteCtrl;                //遥控类型 0选控/1直控/2单装置复归/3全站总复归
    uint16_t  ModbusType;                 //modbus属性
    uint16_t  Close_Address;              //选择控合寄存器地址
    uint16_t  Open_Address;               //选择控分寄存器地址
    uint16_t  Close_Value;                //选择控合值
    uint16_t  Open_Value;                 //选择控分值

    uint16_t  EX_Close_Addr;              //执行控合寄存器地址
    uint16_t  EX_Open_Addr ;              //执行控分寄存器地址
    uint16_t  EX_Close_Value;             //执行控合值
    uint16_t  EX_Open_Value;              //执行控分值

    uint16_t  Control_type;               //遥控类型

}CONFIG_MODBUS_CONTROL_METER;             //遥控表

typedef struct{

    uint8_t   Name[50];                   //名称 C
    uint8_t   key[10];                   //关键字
    uint16_t  CMD ;                      //功能码 J
    uint16_t  ModbusType;                 //modbus属性

    uint16_t  Reg_Address;               //寄存器地址 E
    uint16_t  Reg_Number;                //寄存器个数 F
    uint16_t  Data_Number;               //数据字节个数 G
    uint16_t  Data_Type;                 //数据类型 H

    uint16_t  byte_seq;                  //字节顺序 I     （0：高前低后  1：低后高前）

    uint16_t  Control_type;              //遥设类型 K
    uint16_t  Offset;                    //偏移值(基值)

    float  Factor;                       //系数 L

}CONFIG_MODBUS_SET_METER;                //遥设表

typedef struct{

    uint8_t   Name[50];                   //名称 C
    uint8_t   key[10];                    //关键字
    uint16_t  CMD ;                       //功能码 J
    uint16_t  ModbusType;                 //modbus属性


    uint16_t  Frame_Header;               //帧头
    uint16_t  Frame_Tail;                 //帧尾

    uint16_t  Device_Addr;                //纽脉设备地址
    uint16_t  Data_Type;                  //数据类型 H

    uint16_t  byte_seq;                   //字节顺序 I   （0：高前低后  1：低后高前）

    uint16_t  Control_type;              //遥控类型 K

    uint16_t  Offset;                    //偏移值(基值)

    float  Factor;                       //系数 K

}CONFIG_NM_MODULE_METER;                 //非标纽脉模块 表

/***************** modbus 自定义联合体 ***********************/
typedef union _METER_UINION_
{
    CONFIG_MODBUS_SET_METER set;           //遥设表
    CONFIG_MODBUS_CONTROL_METER control;   //遥控表
    CONFIG_MODBUS_PULSE_METER pulse;       //遥脉表
    CONFIG_MODBUS_SIGNAL_METER signal;     //遥信表
    CONFIG_MODBUS_SURVERY_METER survery;   //遥测表
    CONFIG_NM_MODULE_METER  nm_module;     //非标纽脉模块 表

    uint8_t meret_u8[82];
    uint16_t meret_u16[41];

}MODBUS_METER_UNION;                          // lend = 82

typedef struct _MODBUS_METER_Typedef         //   设备 寄存器定义配置 列表
{
    uint16_t  ys_totalt;          //遥设表长度（点位）
    uint16_t  yk_totalt;          //遥控表长度（点位）
    uint16_t  ym_totalt;          //遥脉表长度（点位）
    uint16_t  yx_totalt;          //遥信表长度（点位）
    uint16_t  yc_totalt;          //遥测表长度（点位）

    MODBUS_METER_UNION   modbus_meter[24];    //len = 82 *24 = 2016~~ 2048 一个扇区 （预留5个扇区）

}MODBUS_METER_Typedef;

typedef struct   _Module_List       //采集模型列表     FLASH_MODULE_CONFIG_ADDR
{
    uint16_t  set_len;              //遥设表长度（点位）
    uint16_t  control_len;          //遥控表长度（点位）
    uint16_t  pulse_len;            //遥脉表长度（点位）
    uint16_t  signal_len;           //遥信表长度（点位）
    uint16_t  survery_len;          //遥测表长度（点位）

    CONFIG_MODBUS_SET_METER     *set;       //遥设表
    CONFIG_MODBUS_CONTROL_METER *control;   //遥控表
    CONFIG_MODBUS_PULSE_METER   *pulse;     //遥脉表
    CONFIG_MODBUS_SIGNAL_METER  *signal;    //遥信表
    CONFIG_MODBUS_SURVERY_METER *survery;   //遥测表

}Model_List_Typedef;                        //len=32

typedef struct   _MODBUS_Model_List       // 通道设备列表
{
    uint16_t total ;   //总数
    Model_List_Typedef   Model[64];        // 模块设置配置  68*32

}MODBUS_Model_List_Typedef;

typedef struct   Equipment_List                          //   采集设备 列表
{
    uint8_t   supplier[50];                             //  厂家名称

    uint8_t   model_name[50];                           //  型号

    uint16_t  channel;                                  // 通道 编号

    uint16_t  address;                                  // 通讯地址

    uint16_t  Protocol;                                 // 协议类型  //默认modbus协议

    Model_List_Typedef *models_list;                     //采集模型列表        110字节

}Equipment_List_Typedef;


typedef struct   _MODBUS_Channel_Module               //通道设备列表
{
    uint16_t total ;   //总数
    Equipment_List_Typedef   module[18];              // 模块设置配置

}MODBUS_Channel_Module_Typedef;


typedef struct svr_cfg_s
{
	bool              enable;
	char              ip[16];
	unsigned short    port;
	unsigned int      invalid_timeout;
	unsigned int      offline_timeout;
}svr_cfg_t;

typedef struct clt_cfg_s
{
	bool              enable;
	char              ip[16];
	int               port;
	unsigned int      reconnect_cycle;
	unsigned int      heartbeat_cycle;
}clt_cfg_t;


typedef struct dl_log_s
{
	/** 路径 */
	char dir[512];
	/** 级别 */
	int level;
	/** 输出方式:0-不输出,1-文件,2-控制台,4-控制+文件 */
	char style;
	/** 文件上限,超限自动删除 0-10000*/
	int maxfiles;
	/** 日志文件名字前缀 */
	char prefix[128];
}dl_log_t, * pdl_log_t;


typedef struct serial_cfg_s
{
    bool   isEnable;                //串口是否可用
    int	   Num;
    char   serialport[128];
    int    nBaudrate;
    int    nDatabit;
    int    nStopbit;
    int    nParity;
    int    nrefresh;
    int    Type;
}serial_cfg_t;

#pragma pack(pop)

#endif // _APP_STRUCT_H_
